package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;

public class ModifierAlbum {

	private Shell shell;
	private Display display = null;
	private Text titre;
	private Text sousTitre;
	private Label lblPrface, lblPostface;
	private StyledText preface, postface;
	private Button btnPartag, btnMettreJour;
	
	private int idAlbum = -1;

	Connection conn;
	Statement stmt;

	/**
	 * Constructeur de la classe, initialise uniquement
	 * l'écran à utiliser pour afficher la fenêtre
	 */
	public ModifierAlbum(){
		display = MainApp.display;
	}
	
	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(int idAlbum){
		if(shell == null || shell.isDisposed()){
			this.idAlbum = idAlbum;
			run();
		}else
			shell.setActive();
	}

	/**
	 * Cette fonction initialise la fenêtre.
	 * Elle se termine en l'affichant.
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){

		shell = new Shell(display, SWT.APPLICATION_MODAL | ( SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX));		// Crée une fenètre non redimensionnable, au dessus des autres
		shell.setText("Modifier ");
		shell.setSize(738, 412);
		shell.setImage(MainApp.icone);
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		shell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent arg0) {
				idAlbum = -1;
				MainApp.consult.setActive();
			}
		});
		
		titre = new Text(shell, SWT.BORDER);
		titre.setBounds(126, 10, 596, 21);
		
		sousTitre = new Text(shell, SWT.BORDER);
		sousTitre.setBounds(126, 37, 596, 21);
		
		btnPartag = new Button(shell, SWT.CHECK);
		btnPartag.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
			}
		});
		btnPartag.setBounds(126, 64, 596, 16);
		btnPartag.setText("");
		
		preface = new StyledText(shell, SWT.BORDER);
		preface.setEnabled(false);
		preface.setBounds(126, 90, 596, 125);
		
		postface = new StyledText(shell, SWT.BORDER);
		postface.setEnabled(false);
		postface.setBounds(126, 221, 596, 124);
		
		Label lblTitre = new Label(shell, SWT.NONE);
		lblTitre.setBounds(10, 10, 110, 15);
		lblTitre.setText("Titre :");
		
		Label lblSoustitre = new Label(shell, SWT.NONE);
		lblSoustitre.setBounds(10, 37, 110, 15);
		lblSoustitre.setText("Sous-titre :");
		
		Label lblPartag = new Label(shell, SWT.NONE);
		lblPartag.setBounds(10, 64, 110, 15);
		lblPartag.setText("Partagé :");
		
		lblPrface = new Label(shell, SWT.NONE);
		lblPrface.setEnabled(false);
		lblPrface.setBounds(10, 90, 110, 15);
		lblPrface.setText("Préface :");
		
		lblPostface = new Label(shell, SWT.NONE);
		lblPostface.setEnabled(false);
		lblPostface.setBounds(10, 221, 110, 15);
		lblPostface.setText("Postface :");
		
		btnMettreJour = new Button(shell, SWT.NONE);
		btnMettreJour.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				updateBase();
			}
		});
		btnMettreJour.setBounds(642, 351, 80, 25);
		btnMettreJour.setText("Mettre à jour");
		
		rafraichir();
		if(estLance())
			shell.open();
	}

	public void rafraichir(){

		titre.setText("");
		sousTitre.setText("");
		preface.setText("");
		preface.setEnabled(false);
		lblPrface.setEnabled(false);
		postface.setText("");
		postface.setEnabled(false);
		lblPostface.setEnabled(false);
		btnMettreJour.setEnabled(false);
		
		if(MainApp.idClient == 0 || idAlbum == -1){
			shell.dispose();
			MainApp.consult.setActive();
			return;
		}
		try {
			conn = JDBC.getInstance().getConnection();
			conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
			stmt = conn.createStatement();
			
			String req = "SELECT idClient, titre, sousTitre, partage, preface, postface FROM Album a LEFT JOIN Livre l ON a.idAlbum = l.idAlbum WHERE a.idAlbum = " + idAlbum;
			ResultSet rset = stmt.executeQuery(req);
			if (rset.next()){
				titre.setText(rset.getString(2));
				shell.setText("Modifier " + titre.getText());
				if(rset.getString(3) != null)
					sousTitre.setText(rset.getString(3));
				btnPartag.setSelection(rset.getString(4).equalsIgnoreCase("o"));
				if(rset.getString(5) != null){
					preface.setText(rset.getString(5));
					preface.setEnabled(true);
					lblPrface.setEnabled(true);
					if(rset.getString(6) != null){
						postface.setText(rset.getString(6));
						postface.setEnabled(true);
						lblPostface.setEnabled(true);
					}
				}
			}
			
			if(rset.getInt(1) == MainApp.idClient)
				btnMettreJour.setEnabled(true);
			
			conn.commit();
			rset.close();
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			try {
				conn.rollback();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			MainApp.erreurBase(e.getMessage());
		}
	}
	
	private void updateBase(){
		if(titre.getText().trim() != "")
		try {
			conn = JDBC.getInstance().getConnection();
			conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
			stmt = conn.createStatement();
			
			String req = "UPDATE Album SET titre = '" + titre.getText().trim().replace('\'', '_')
					+ "', sousTitre = '" + sousTitre.getText().trim().replace('\'', '_')
					+ "', partage = '" + (btnPartag.getSelection() ? "o" : "n")
					+ "' WHERE idAlbum = " + idAlbum;
			stmt.executeUpdate(req);
			
			if(preface.isEnabled()){
				req = "UPDATE Livre SET preface = '" + preface.getText().trim().replace('\'', '_')
						+ "', postface = '" + postface.getText().trim().replace('\'', '_')
						+ "' WHERE idAlbum = " + idAlbum;
				stmt.executeUpdate(req);
			}

			conn.commit();
			stmt.close();
			conn.close();
			shell.dispose();
		} catch (SQLException e) {
			try {
				conn.rollback();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			MainApp.erreurBase(e.getMessage());
		}
	}

	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
}
